home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib17.dsk / BLACK BOX.bas next >
BASIC Source File  |  2023-02-26  |  10KB  |  254 lines

  1. 10  REM  **********************
  2. 20  REM  *      BLACK BOX     *
  3. 30  REM  *    BY GARY KNOX    *
  4. 40  REM  * COPYRIGHT (C) 1984 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * LINCOLN, MA. 01773 *
  7. 70  REM  **********************
  8. 80  GOSUB 1720
  9. 90  DEF  FN R(Q) =  INT(8 * RND(3)) +1
  10. 100  HOME : VTAB 12
  11. 110  INPUT "ENTER # OF ATOMS (UP TO 8) ";N
  12. 120  IF N < = 0  OR N >8  THEN  VTAB 4: PRINT "TRY AGAIN": CALL  -958: VTAB 12: GOTO 110
  13. 130 DI =  INT((N +3)/4)
  14. 140  FOR K = 1 TO 8:A(K) = 0:B(K) = 0:: NEXT 
  15. 150 A(1) =  FN R(3):B(1) =  FN R(3)
  16. 160  FOR K = 2 TO N
  17. 170 CX =  FN R(3):CY =  FN R(3)
  18. 180  FOR L = 1 TO K -1
  19. 190  IF A(L) = CX  AND B(L) = CY  THEN 170
  20. 200  NEXT L
  21. 210 A(K) = CX:B(K) = CY
  22. 220  NEXT K
  23. 230  HOME 
  24. 240  REM 
  25. 250  REM  **DRAW THE BLACK BOX**
  26. 260  GOSUB 1610
  27. 270  VTAB 2: HTAB 15: PRINT "SIDE 1"
  28. 280  VTAB 9: PRINT "SIDE 4"
  29. 290  VTAB 9: HTAB 29: PRINT "SIDE 2"
  30. 300  VTAB 17: HTAB 15: PRINT "SIDE 3"
  31. 310  VTAB 18: CALL  -958: HTAB 1
  32. 320  HTAB 1: VTAB 19: PRINT "POINTS = "PT
  33. 330  REM 
  34. 340  REM  **ENTER FIRING POSITION**
  35. 350  VTAB 21: INPUT "ENTER SIDE # ";S
  36. 360  IF S >4  OR S <0  THEN 310
  37. 370 PT = PT - INT(20/DI)
  38. 380  VTAB 21: CALL  -958: INPUT "ENTER POSITION NUMBER ON THAT SIDE ";P
  39. 390  IF P >8  OR P <0  THEN 380
  40. 400  INVERSE 
  41. 410  GOSUB 980: GOSUB 1090: GOSUB 1500
  42. 420  PRINT P
  43. 430 FF = 0
  44. 440 TX = X +XD:TY = Y +YD
  45. 450  IF FF = 1  THEN 490
  46. 460  FOR K = 1 TO N
  47. 470  IF A(K) = TX  AND B(K) = TY  THEN ZX$ = "ABSORBED": GOTO 750
  48. 480  NEXT K
  49. 490  RESTORE 
  50. 500  FOR K = 1 TO S
  51. 510  FOR L = 1 TO 4
  52. 520  READ CX(L),CY(L)
  53. 530  DATA -1,0,1,0,-1,1,1,1,0,-1,0,1,-1,-1,-1,1
  54. 540  DATA    -1,0,1,0,1,-1,-1,-1,0,-1,0,1, 1, 1, 1,-1
  55. 550  NEXT L
  56. 560  NEXT K
  57. 570  IF FF = 1  THEN 630
  58. 580 FF = 1
  59. 590  FOR K = 1 TO N
  60. 600  IF A(K) = TX +CX(1)  AND B(K) = TY +CY(1)  THEN ZX$ = "REFLECTED BACK": GOTO 740
  61. 610  IF A(K) = TX +CX(2)  AND B(K) = TY +CY(2)  THEN ZX$ = "REFLECTED BACK": GOTO 740
  62. 620  NEXT K
  63. 630  FOR K = 1 TO N
  64. 640  IF A(K) = TX +XD  AND B(K) = TY +YD  THEN ZX$ = "ABSORBED": GOTO 750
  65. 650  IF A(K) = TX +CX(3)  AND B(K) = TY +CY(3)  THEN ZX$ = "REFLECTED": GOTO 830
  66. 660  IF A(K) = TX +CX(4)  AND B(K) = TY +CY(4)  THEN ZX$ = "REFLECTED": GOTO 880
  67. 670  NEXT K
  68. 680 X = TX:Y = TY
  69. 690  IF X = 0  OR X = 9  OR Y = 0  OR Y = 9  THEN 710
  70. 700  GOTO 440
  71. 710 S = (S +2) - INT((S +2)/4) *4
  72. 720  IF S = 0  THEN S = 4
  73. 730  IF ZX$ = ""  THEN ZX$ = "PASSED THROUGH"
  74. 740  FLASH : GOSUB 980: PRINT P
  75. 750  HTAB 15: VTAB 23: INVERSE : PRINT ZX$:ZX$ = "": FOR ZZ = 1 TO 2000: NEXT ZZ: NORMAL 
  76. 760  HTAB 1: VTAB 19: CALL  -958: PRINT "POINTS = "PT
  77. 770  VTAB 22: PRINT "------  ------ -------"
  78. 780  VTAB 21: CALL  -868: INPUT "Q=QUIT  F=FIRE G=GUESS  (ENTER CHOICE)";PQ$
  79. 790  IF PQ$ = "F"  THEN  GOSUB 1610: GOTO 310
  80. 800  IF PQ$ = "Q"  THEN  GOSUB 1610: GOTO 1200
  81. 810  IF PQ$ = "G"  THEN 1250
  82. 820  GOTO 780
  83. 830 TT = 3: GOSUB 1670
  84. 840  GOSUB 1090
  85. 850  IF  ABS(XD) = 1  THEN P = TY: GOTO 680
  86. 860 P = TX
  87. 870  GOTO 680
  88. 880 TT = 1: GOSUB 1670
  89. 890  GOSUB 1090
  90. 900  IF  ABS(XD) = 1  THEN P = TY: GOTO 680
  91. 910 P = TX
  92. 920  GOTO 680
  93. 930 TT = 2: GOSUB 1670
  94. 940  GOSUB 1090
  95. 950  GOTO 680
  96. 960  REM 
  97. 970  REM  **CALCULATE BOX POSITION**
  98. 980  ON S GOTO 990,1010,1030,1050
  99. 990  VTAB 5: HTAB (2 *P +8)
  100. 1000  GOTO 1060
  101. 1010  HTAB 26: VTAB (P +5)
  102. 1020  GOTO 1060
  103. 1030  VTAB 14: HTAB (2 *P +8)
  104. 1040  GOTO 1060
  105. 1050  VTAB (P +5): HTAB 8
  106. 1060  RETURN 
  107. 1070  REM 
  108. 1080  REM  **GET MOTION INCREMENTS**
  109. 1090  ON S GOTO 1100,1120,1140,1160
  110. 1100 XD = 0:YD = 1
  111. 1110  GOTO 1170
  112. 1120 XD =  -1:YD = 0
  113. 1130  GOTO 1170
  114. 1140 XD = 0:YD =  -1
  115. 1150  GOTO 1170
  116. 1160 XD = 1:YD = 0
  117. 1170  RETURN 
  118. 1180  REM 
  119. 1190  REM  **PRINT ALL ATOMS**
  120. 1200  FOR K = 1 TO N
  121. 1210  HTAB (2 *A(K) +8): VTAB (B(K) +5): PRINT "*"
  122. 1220  NEXT K
  123. 1230  VTAB 20: HTAB 1: CALL  -958: VTAB 21: PRINT "THIS IS WHERE THE ATOMS WERE!": FOR ZZ = 1 TO 2000: NEXT : GOTO 1440
  124. 1240  REM 
  125. 1250  REM  **ENTER GUESS AND CHECK**
  126. 1260  VTAB 20: CALL  -958
  127. 1270  NORMAL : VTAB 21
  128. 1280  INPUT "ENTER ROW ";R
  129. 1290  PRINT 
  130. 1300  INPUT "ENTER COLUMN ";C
  131. 1310  FOR W9 = 1 TO CO
  132. 1320  IF C = C(W9)  AND R = D(W9)  THEN 1410
  133. 1330  NEXT W9
  134. 1340  FOR K = 1 TO N
  135. 1350  IF A(K) = C  AND B(K) = R  THEN  INVERSE : HTAB 22: VTAB 22: PRINT "CORRECT": FOR EE = 1 TO 3000: NEXT :CO = CO +1:PT = PT + INT(500 *DI): GOTO 1370
  136. 1360  GOTO 1390
  137. 1370  HTAB (2 *A(K) +8): VTAB (B(K) +5): NORMAL : PRINT "*"
  138. 1380 C(CO) = C:D(CO) = R: NORMAL : GOSUB 1610: HTAB 1: VTAB 20: CALL  -958: GOTO 1420
  139. 1390  NEXT K
  140. 1400  INVERSE : HTAB 22: VTAB 22: PRINT "NOT CORRECT": FOR ZZ = 1 TO 3000: NEXT : NORMAL 
  141. 1410  HTAB 1: VTAB 20: CALL  -958: GOSUB 1610:PT = PT -100 *DI: GOTO 760
  142. 1420  IF CO < >N  THEN 760
  143. 1430  VTAB 21: HTAB 1: CALL  -958: VTAB 21: PRINT "YOU GUESSED THEM ALL!!"
  144. 1440  VTAB 19: PRINT "POINTS = "PT: HTAB 1: VTAB 22
  145. 1450  PRINT : INPUT "PLAY ANOTHER GAME?  Y OR N ?";A$: IF  LEFT$(A$,1) = "Y"  THEN  CLEAR : GOTO 90
  146. 1460  FOR ZZ = 1 TO 1000: NEXT : HOME : END 
  147. 1470  GOTO 310
  148. 1480  REM 
  149. 1490  REM  **GET FIRING COORDINATES**
  150. 1500  ON S GOTO 1510,1530,1550,1570
  151. 1510 X = P:Y = 0
  152. 1520  GOTO 1580
  153. 1530 X = 9:Y = P
  154. 1540  GOTO 1580
  155. 1550 X = P:Y = 9
  156. 1560  GOTO 1580
  157. 1570 X = 0:Y = P
  158. 1580  RETURN 
  159. 1590  REM 
  160. 1600  REM  **PRINT BOX NUMBERS**
  161. 1610  HTAB 10: VTAB 5: FOR X = 1 TO 8: PRINT X" ";: NEXT X: PRINT : VTAB 6
  162. 1620  FOR X = 1 TO 8: HTAB 8: PRINT X;: HTAB 26: PRINT X: NEXT X: VTAB 14: HTAB 10
  163. 1630  FOR X = 1 TO 8: PRINT X" ";: NEXT X
  164. 1640  RETURN 
  165. 1650  REM 
  166. 1660  REM  **CHANGE DIRECTION**
  167. 1670 S = (S +TT) - INT((S +TT)/4) *4
  168. 1680  IF S = 0  THEN S = 4
  169. 1690  RETURN 
  170. 1700  REM 
  171. 1710  REM  **DIRECTIONS FOR GAME**
  172. 1720  HOME 
  173. 1730  VTAB 10: HTAB 15: PRINT "BLACK BOX"
  174. 1740  VTAB 12: HTAB 19: PRINT "BY"
  175. 1750  VTAB 14: HTAB 15: PRINT "GARY KNOX": VTAB 20: PRINT "** COPYRIGHT 1983 BY MICROSPARC, INC. **"
  176. 1760  VTAB 24: HTAB 15: INPUT "PUSH RETURN TO GO ON..";PP$
  177. 1770  HOME : VTAB 12: INPUT "DIRECTIONS Y=YES  N=NO ";PP$
  178. 1780  IF  LEFT$(PP$,1) = "N"  THEN 2440
  179. 1790  SPEED= 200: HOME : VTAB 5
  180. 1800  PRINT "  THE COMPUTER WILL RANDOMLY PLACE": PRINT : HTAB 10: PRINT "ATOMS IN A BLACK BOX."
  181. 1810  PRINT : PRINT "  YOU MUST GUESS WHERE THEY ARE!"
  182. 1820  PRINT : PRINT "YOU MUST FIRE ATOMS INTO THE BOX AND"
  183. 1830  PRINT : HTAB 2
  184. 1840  PRINT "THE COMPUTER WILL SHOW WHERE THEY"
  185. 1850  PRINT : HTAB 16
  186. 1860  PRINT "COME OUT."
  187. 1870  GOSUB 2460
  188. 1880  HOME : VTAB 5: HTAB 5: PRINT "WHEN YOU FIRE AN ATOM INTO THE ": CALL  -922: PRINT "BLACK BOX, IT WILL BE...."
  189. 1890  CALL  -922: HTAB 15: PRINT "ABSORBED": CALL  -922: HTAB 15: PRINT "REFLECTED": CALL  -922: HTAB 12: PRINT "OR REJECTED."
  190. 1900  GOSUB 2460
  191. 1910  HOME : PRINT "THE ATOM IS ABSORBED IF YOU FIRE": CALL  -922: PRINT "DIRECTLY AT AN ATOM IN THE BOX."
  192. 1920  VTAB 5: GOSUB 1610: HTAB 14: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  193. 1930  GOSUB 2470
  194. 1940 QQ = 10: GOSUB 2480
  195. 1950  FOR K = 1 TO 1000: NEXT 
  196. 1960  GOSUB 2460
  197. 1970  HOME : PRINT "THE ATOM WILL PASS STRAIGHT THROUGH": PRINT "THE BOX IF NO ATOM IS IN THE WAY."
  198. 1980  VTAB 5: GOSUB 1610: HTAB 18: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  199. 1990  GOSUB 2470
  200. 2000 QQ = 6: GOSUB 2480
  201. 2010  VTAB 5: HTAB 14: FLASH : PRINT "3": NORMAL 
  202. 2020  FOR K = 1 TO 1000: NEXT 
  203. 2030  GOSUB 2460
  204. 2040  HOME : PRINT "THE ATOM YOU FIRE IS REFLECTED": PRINT "TO THE LEFT WHEN IT APPROACHES": PRINT "AN ATOM DIAGONALLY TO ITS RIGHT."
  205. 2050  VTAB 5: GOSUB 1610: HTAB 16: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  206. 2060  GOSUB 2470
  207. 2070 QQ = 10: GOSUB 2480
  208. 2080 QQ = 9:RR =  -1:PP = 13: GOSUB 2490
  209. 2090  FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
  210. 2100  HOME : PRINT "THE ATOM YOU FIRE IS REFLECTED": PRINT "TO THE RIGHT WHEN IT APPROACHES": PRINT "AN ATOM DIAGONALLY TO ITS LEFT."
  211. 2110  VTAB 5: GOSUB 1610: HTAB 12: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  212. 2120  GOSUB 2470
  213. 2130 QQ = 10: GOSUB 2480
  214. 2140 QQ = 25:RR = 1:PP = 15: GOSUB 2490
  215. 2150  FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
  216. 2160  HOME : PRINT "THE ATOM YOU FIRE IS REJECTED": PRINT "IF IT IS AGAINST A WALL AND": PRINT "YOU FIRE INTO THE BOX NEXT TO IT."
  217. 2170  VTAB 5: GOSUB 1610: HTAB 12: VTAB 13: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  218. 2180  GOSUB 2470
  219. 2190  HTAB 14: VTAB 13: PRINT " ": FOR J = 1 TO 500: NEXT : NORMAL : HTAB 14: VTAB 13: PRINT " ": HTAB 14: VTAB 14: FLASH : PRINT "3"
  220. 2200  FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
  221. 2210  HOME : PRINT "WITH MORE THAN ONE ATOM IN THE BOX": PRINT "IT GETS INTERESTING."
  222. 2220  VTAB 5: GOSUB 1610: HTAB 12: VTAB 9: PRINT "*": HTAB 22: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
  223. 2230  GOSUB 2470
  224. 2240 QQ = 10: GOSUB 2480
  225. 2250 QQ = 20:RR = 1:PP = 15: GOSUB 2490
  226. 2260  FOR K = 11 TO 13: INVERSE : HTAB 20: VTAB K: PRINT " ": FOR J = 1 TO 500: NEXT : NORMAL : HTAB 20: VTAB K: PRINT " ": NEXT K: FLASH : HTAB 20: VTAB 14: PRINT "6"
  227. 2270  FOR K = 1 TO 1000: NEXT K: NORMAL : GOSUB 2460
  228. 2280  HOME : VTAB 7
  229. 2290  PRINT "WHEN YOU ARE READY TO GUESS WHERE"
  230. 2300  PRINT : PRINT "AN ATOM IS HIDDEN...."
  231. 2310  PRINT : PRINT "YOU WILL BE ASKED FOR THE ROW NUMBER."
  232. 2320  PRINT : PRINT "(HORIZONTAL)  ";: SPEED= 100: INVERSE : FOR ZZ = 1 TO 20: PRINT " ";: NEXT : SPEED= 200: NORMAL : PRINT 
  233. 2330  GOSUB 2460
  234. 2340  HOME : VTAB 7: PRINT "THEN YOU WILL BE ASKED FOR..."
  235. 2350  PRINT : PRINT "THE COLUMN NUMBER FOR THE HIDDEN ATOM."
  236. 2360  PRINT : PRINT "(VERTICAL)";: INVERSE : SPEED= 100: FOR ZZ = 11 TO 20: HTAB 13: VTAB ZZ: PRINT " ": NEXT : SPEED= 200: NORMAL 
  237. 2370  GOSUB 2460
  238. 2380  HOME : VTAB 7: PRINT "THE POINT SYSTEM IS..."
  239. 2390  VTAB 10: HTAB 15: PRINT "1-4 ATOMS"; SPC( 5);"5-8 ATOMS"
  240. 2400  HTAB 15: PRINT "---------"; SPC( 5);"---------"
  241. 2410  PRINT : PRINT "FIRE INTO BOX";: HTAB 19: PRINT  -20; SPC( 9); -10: PRINT : PRINT "WRONG GUESS";: HTAB 18: PRINT  -100; SPC( 8); -200
  242. 2420  PRINT : PRINT "CORRECT GUESS";: HTAB 19: PRINT 500; SPC( 8);1000: GOSUB 2460
  243. 2430  HOME : VTAB 10: PRINT "WOULD YOU LIKE TO REPEAT": PRINT : PRINT "THE EXPLANATION?  Y OR N";: INPUT A$: IF  LEFT$(A$,1) = "Y"  THEN 1790
  244. 2440  SPEED= 255: RETURN 
  245. 2450  REM 
  246. 2460  VTAB 24: HTAB 15: INPUT "PUSH RETURN TO GO ON..";PP$: RETURN 
  247. 2470  VTAB 20: PRINT "PUSH THE 'F' KEY TO FIRE...";: GET PP$: RETURN 
  248. 2480  FOR K = 13 TO QQ  STEP  -1: INVERSE : HTAB 14: VTAB K: PRINT " ": FOR J = 1 TO 250: NEXT J: HTAB 14: VTAB K: NORMAL : PRINT " ": NEXT K: RETURN 
  249. 2490  FOR K = PP TO QQ  STEP RR: HTAB K: VTAB 10: INVERSE : PRINT " ": FOR J = 1 TO 250: NEXT J: NORMAL : HTAB K: VTAB 10: PRINT " ": NEXT K
  250. 2500  IF QQ = 20  THEN 2540
  251. 2510  IF RR = 1  THEN  HTAB 26: GOTO 2530
  252. 2520  HTAB 8
  253. 2530  VTAB 10: FLASH : PRINT "5"
  254. 2540  RETURN